package com.Humanities.checkcode.service.impl;

import com.Humanities.checkcode.service.AbstractCheckCodeService;
import com.Humanities.checkcode.service.CheckCodeService;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.xuecheng.base.utils.EncryptUtil;
import com.Humanities.checkcode.feignclient.XcuserClient;
import com.Humanities.checkcode.model.CheckCodeParamsDto;
import com.Humanities.checkcode.model.CheckCodeResultDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sun.misc.BASE64Encoder;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * @author Mr.M
 * @version 1.0
 * @description 图片验证码生成器
 * @date 2022/9/29 16:16
 */
@Service("PicCheckCodeService") // 标注为 Spring 服务组件，名称为 PicCheckCodeService
public class PicCheckCodeServiceImpl extends AbstractCheckCodeService implements CheckCodeService {

    private static final Logger log = LoggerFactory.getLogger(PicCheckCodeServiceImpl.class);
    @Autowired
    private DefaultKaptcha kaptcha; // 注入 DefaultKaptcha，用于生成图片验证码
    @Autowired
    XcuserClient xcuserClient; // 注入用户客户端，用于查询用户信息

    @Resource(name="NumberLetterCheckCodeGenerator") // 注入数字字母验证码生成器
    @Override
    public void setCheckCodeGenerator(CheckCodeGenerator checkCodeGenerator) {
        this.checkCodeGenerator = checkCodeGenerator; // 设置验证码生成器
    }

    @Resource(name="UUIDKeyGenerator") // 注入 UUID Key 生成器
    @Override
    public void setKeyGenerator(KeyGenerator keyGenerator) {
        this.keyGenerator = keyGenerator; // 设置 Key 生成器
    }

    @Resource(name="RedisCheckCodeStore") // 注入 Redis 验证码存储器
    @Override
    public void setCheckCodeStore(CheckCodeStore checkCodeStore) {
        this.checkCodeStore = checkCodeStore; // 设置验证码存储器
    }

    @Override
    public CheckCodeResultDto generate(CheckCodeParamsDto checkCodeParamsDto) {
        // 调用父类的 generate 方法生成验证码
        GenerateResult generate = generate(checkCodeParamsDto, 4, "checkcode:", 60);
        String key = generate.getKey(); // 获取生成的 Key
        String code = generate.getCode(); // 获取生成的验证码
        String pic = createPic(code); // 生成验证码图片
        CheckCodeResultDto checkCodeResultDto = new CheckCodeResultDto();
        checkCodeResultDto.setAliasing(pic); // 设置图片的 Base64 编码
        checkCodeResultDto.setKey(key); // 设置验证码的 Key
        return checkCodeResultDto; // 返回结果
    }

     //根据手机号或者邮箱发送验证码
    @Override
    public CheckCodeResultDto phoneCode(String param1) {

        //两个都填写优先使用手机号找回
        GenerateResult generate = null;
        //
        if (param1.matches("^[0-9]{11}$")){
//            //手机号查找用户
//            XcUser xcuser = xcuserClient.findXcuserByPhone(param1);
//            if (xcuser==null){
//                throw new RuntimeException("手机号未注册不存在");
//            }

            generate = this.generate(new CheckCodeParamsDto(), 4, param1 + ":", 600);
            CheckCodeResultDto checkCodeResultDto = new CheckCodeResultDto();
            checkCodeResultDto.setAliasing(null);
            checkCodeResultDto.setKey(generate.getKey());
            checkCodeResultDto.setAliasing(createPic(generate.getCode()));
            log.debug("key:{},手机号验证码:{}",generate.getKey(),generate.getCode());
          return checkCodeResultDto;
        }else {
            //邮箱查找用户
//            XcUser xcuser = xcuserClient.findXcuserByPhone(param1);
//            if (xcuser == null) {
//                throw new RuntimeException("邮箱不存在");
//            }
            generate = this.generate(new CheckCodeParamsDto(), 4, param1 + ":", 600);
            CheckCodeResultDto checkCodeResultDto = new CheckCodeResultDto();
            checkCodeResultDto.setAliasing(null);
            checkCodeResultDto.setKey(generate.getKey());
            checkCodeResultDto.setAliasing(createPic(generate.getCode()));
            log.debug("key:{},邮箱验证码:{}",generate.getKey(),generate.getCode());
            return checkCodeResultDto;
        }

    }

    private String createPic(String code) {
        // 生成图片验证码
        ByteArrayOutputStream outputStream = null; // 定义字节输出流
        BufferedImage image = kaptcha.createImage(code); // 使用 Kaptcha 生成验证码图片

        outputStream = new ByteArrayOutputStream(); // 初始化字节输出流
        String imgBase64Encoder = null; // 定义 Base64 编码字符串
        try {
            // 对字节数组进行 Base64 编码
            BASE64Encoder base64Encoder = new BASE64Encoder();
            ImageIO.write(image, "png", outputStream); // 将图片写入字节输出流
            imgBase64Encoder = "data:image/png;base64," + EncryptUtil.encodeBase64(outputStream.toByteArray()); // 生成 Base64 编码字符串
        } catch (IOException e) {
            e.printStackTrace(); // 捕获并打印异常
        } finally {
            try {
                outputStream.close(); // 关闭字节输出流
            } catch (IOException e) {
                e.printStackTrace(); // 捕获并打印异常
            }
        }
        return imgBase64Encoder; // 返回 Base64 编码字符串
    }
}